package com.cskaoyan.javase.array._2momery;

/**
 * 数组的动态初始化
 *
 * 数组对象中如果存储基本数据类型变量，那么就直接存储基本数据类型变量的取值！
 *
 * @since 10:12
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        /*
            int[] arr = new int[3];
            以上语句是声明初始化了一个数组变量
            数组是引用数据类型
            上述代码就是声明初始化了一个引用数据类型变量
            其中，等号左右两边分开看：
                左边是数组的声明
                arr是数组的名字和以往定义在方法中的变量名一样
                它是一个局部变量
                局部变量就应该存储对应方法的栈帧中

                右边使用new关键字创建数组对象，是数组的初始化
                对象存储在堆上

            于是一个数组引用数据类型变量就分成两个部分：
                1.在方法的栈帧中存储数组名，称之为数组对象的引用
                    或者引用数据类型的引用
                2.在堆上开辟空间，创建数组对象
                    是引用数据类型的对象

            总之：引用数据类型变量和基本数据类型变量不同
                基本数据类型变量一定存储在方法的栈帧中，一定是一个局部变量
                一个引用数据类型变量要分为两个部分：
                    a.在栈中存储引用（引用数据类型的引用）
                        引用是局部变量
                    b.在堆上存储对象（对象是引用数据类型的实质）

               虽然对象是引用数据类型的实质，但是我们不能直接操作对象
               只能间接的通过引用操作堆上的对象
               栈上的引用通过存储堆上对象的地址，和对象产生联系。来间接操作对象
               （引用中存储的是堆上对象的地址，这就是"="的作用）

         */
        int[] arr = new int[3];

        /*
        直接输出数组名，得到以下字符串：
            [I@1540e19d
            解释：
                [表示这是一个一维数组
                I表示这是一个int类型的数组
                1540e19d是一个十六进制的数值
                    这个十六进制数值可以看成是堆上对象的地址值
                补充：
                    这个十六进制数是通过方法，计算对象的内存空间得到的一个值
                    这个值可以近似的看成对象的地址值
                    一般来说，地址值不同，是两个不同的对象
                    地址值相同，一定是同一个对象
         */
        System.out.println(arr);

        /*
            动态初始化中
            数组对象中的元素具有默认值
            int类型数组中元素的默认值是0
         */
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        System.out.println(arr.length);

        arr[0] = 666;
        System.out.println(arr[0]);
        System.out.println(arr);

    }
}
